]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
environment: Disable fullscreen unredirect during all transitions
authorJonas Ådahl <jadahl@gmail.com>
Fri, 13 Sep 2019 09:51:41 +0000 (11:51 +0200)
committerFlorian Müllner <florian.muellner@gmail.com>
Fri, 13 Sep 2019 16:10:17 +0000 (16:10 +0000)
When there is a transition, it's likely that we are animating some part
of the desktop, and in such situations we don't want to unredirect
fullscreen windows.

This fixes unwanted unredirection when e.g. hiding a modal dialog by
re-enabling the unredirection after the animation has finished, instead
of when it starts.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/721

js/ui/environment.js

index bf5b7cb4dd2a0d505907a7aa817126b75e3403cd..1f9420035da4e9a64910436e133cc3055939063c 100644 (file)
@@ -10,7 +10,7 @@ imports.gi.versions.Gtk = '3.0';
 imports.gi.versions.TelepathyGLib = '0.12';
 imports.gi.versions.TelepathyLogger = '0.2';
 
-const { Clutter, GLib, Shell, St } = imports.gi;
+const { Clutter, GLib, Meta, Shell, St } = imports.gi;
 const Gettext = imports.gettext;
 
 // We can't import shell JS modules yet, because they may have
@@ -58,17 +58,16 @@ function _patchLayoutClass(layoutClass, styleProps) {
     };
 }
 
-function _makeEaseCallback(params) {
+function _makeEaseCallback(params, cleanup) {
     let onComplete = params.onComplete;
     delete params.onComplete;
 
     let onStopped = params.onStopped;
     delete params.onStopped;
 
-    if (!onComplete && !onStopped)
-        return null;
-
     return isFinished => {
+        cleanup();
+
         if (onStopped)
             onStopped(isFinished);
         if (onComplete && isFinished)
@@ -110,7 +109,10 @@ function _easeActor(actor, params) {
         actor.set_easing_mode(params.mode);
     delete params.mode;
 
-    let callback = _makeEaseCallback(params);
+    Meta.disable_unredirect_for_display(global.display);
+
+    let cleanup = () => Meta.enable_unredirect_for_display(global.display);
+    let callback = _makeEaseCallback(params, cleanup);
 
     // cancel overwritten transitions
     let animatedProps = Object.keys(params).map(p => p.replace('_', '-', 'g'));
@@ -119,14 +121,11 @@ function _easeActor(actor, params) {
     actor.set(params);
     actor.restore_easing_state();
 
-    if (callback) {
-        let transition = actor.get_transition(animatedProps[0]);
-
-        if (transition)
-            transition.connect('stopped', (t, finished) => callback(finished));
-        else
-            callback(true);
-    }
+    let transition = actor.get_transition(animatedProps[0]);
+    if (transition)
+        transition.connect('stopped', (t, finished) => callback(finished));
+    else
+        callback(true);
 }
 
 function _easeActorProperty(actor, propName, target, params) {
@@ -144,7 +143,10 @@ function _easeActorProperty(actor, propName, target, params) {
     if (actor instanceof Clutter.Actor && !actor.mapped)
         duration = 0;
 
-    let callback = _makeEaseCallback(params);
+    Meta.disable_unredirect_for_display(global.display);
+
+    let cleanup = () => Meta.enable_unredirect_for_display(global.display);
+    let callback = _makeEaseCallback(params, cleanup);
 
     // cancel overwritten transition
     actor.remove_transition(propName);
@@ -153,8 +155,7 @@ function _easeActorProperty(actor, propName, target, params) {
         let [obj, prop] = _getPropertyTarget(actor, propName);
         obj[prop] = target;
 
-        if (callback)
-            callback(true);
+        callback(true);
 
         return;
     }
@@ -169,8 +170,7 @@ function _easeActorProperty(actor, propName, target, params) {
 
     transition.set_to(target);
 
-    if (callback)
-        transition.connect('stopped', (t, finished) => callback(finished));
+    transition.connect('stopped', (t, finished) => callback(finished));
 }
 
 function _loggingFunc(...args) {